package com.note.feng.leetcode.algorithms.easy.seven;

import java.util.Arrays;

public class SevenHundredFourtySeven {
    /**
     * 747 至少是其他数字两倍的最大数
     * 给你一个整数数组 nums ，其中总是存在 唯一的 一个最大整数 。
     *
     * 请你找出数组中的最大元素并检查它是否 至少是数组中每个其他数字的两倍 。如果是，则返回 最大元素的下标 ，否则返回 -1 。
     *
     * 示例 1：
     *
     * 输入：nums = [3,6,1,0]
     * 输出：1
     * 解释：6 是最大的整数，对于数组中的其他整数，6 至少是数组中其他元素的两倍。6 的下标是 1 ，所以返回 1 。
     * 示例 2：
     *
     * 输入：nums = [1,2,3,4]
     * 输出：-1
     * 解释：4 没有超过 3 的两倍大，所以返回 -1 。
     * 示例 3：
     *
     * 输入：nums = [1]
     * 输出：0
     * 解释：因为不存在其他数字，所以认为现有数字 1 至少是其他数字的两倍。
     *
     * 提示：
     *
     * 1 <= nums.length <= 50
     * 0 <= nums[i] <= 100
     * nums 中的最大元素是唯一的
     *
     * 来源：力扣（LeetCode）
     * 链接：https://leetcode.cn/problems/largest-number-at-least-twice-of-others
     */
    /**
     * 解法一：
     * 先排序，找到最大值和次大值，判断是否是所有数的 2 倍；如果不是直接返回 -1；
     * 如果是，再遍历组数，找到最大值的下标，返回
     * @param nums
     * @return
     */
    public int dominantIndex(int[] nums) {
        if(nums.length < 2){
            return -1;
        }
        int [] s = nums.clone();
        Arrays.sort(s);
        if(s[s.length - 1] >= 2 * s[s.length - 2]){
            for (int i = 0; i < nums.length; i++) {
                if(nums[i] == s[s.length - 1]){
                    return i;
                }
            }
        }
        return -1;
    }

    /**
     * 解法二：
     * 一次遍历，找到最大值和次大值的下标，判断最大值是否是次大值的两倍，
     * 是直接返回最大值的下标，否则返回 -1
     * @param nums
     * @return
     */
    public int dominantIndex2(int[] nums) {
        int n = nums.length;
        if(n < 2){
            return -1;
        }
        int a = -1, b = 0;
        for (int i = 1; i < n; i++) {
            if(nums[i] > nums[b]){
                 a = b;
                 b = i;
            }else if(a == -1 || nums[i] > nums[a]){
                a = i;
            }
        }
        return nums[b] >= 2 * nums[a] ? b : -1;
    }
}
